package com.mig.coins.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class PedidoExtended extends Pedido {
	private int nMonedas = 0;
	private int nApuntes = 0;
	private String nombreEstado = null;

	private final static String GET_SQL_SOCIO = 
		"select `pedidos`.`id`, `pedidos`.`descripcion`, `pedidos`.`proveedor`," +
	"  `pedidos`.`fecha`, `pedidos`.`estado`, `pedidos`.`observaciones`," +
	"  (SELECT count(*) FROM `colecciones` c WHERE (c.`pedido` = `pedidos`.`id`) AND (c.`propietario` = ?)) nMonedas, " +
	"  (SELECT count(*) FROM `apuntes` a WHERE (a.`pedido` = `pedidos`.`id`) AND (a.`propietario` = ?)) nApuntes, " +
	"  `estados_pedido`.`estado` " +
	"from `pedidos`, `estados_pedido` " +
	"where ( `estados_pedido`.`id` = `pedidos`.`estado`) ";
	private final static String GET_SQL_GRUPO = 
		"select `pedidos`.`id`, `pedidos`.`descripcion`, `pedidos`.`proveedor`," +
	"  `pedidos`.`fecha`, `pedidos`.`estado`, `pedidos`.`observaciones`," +
	"  (SELECT count(*) FROM `colecciones` c WHERE (c.`pedido` = `pedidos`.`id`)) nMonedas, " +
	"  (SELECT count(*) FROM `apuntes` a WHERE (a.`pedido` = `pedidos`.`id`) AND (a.`propietario` IS NULL)) nApuntes, " +
	"  `estados_pedido`.`estado` " +
	"from `pedidos`, `estados_pedido` " +
	"where ( `estados_pedido`.`id` = `pedidos`.`estado`) ";

	public static PedidoExtended readPedidoExtended(Connection conn, long _id, Integer idSocio) throws SQLException {
		PedidoExtended _pedido = new PedidoExtended(); 
		PreparedStatement stmt=null;
		ResultSet rs = null;
		if (null == idSocio) {
			stmt=conn.prepareStatement(GET_SQL_GRUPO + "AND (`pedido`.`id`=?)");
			stmt.setLong(1, _id);
		} else {
			stmt=conn.prepareStatement(GET_SQL_SOCIO + "AND (`pedido`.`id`=?)");
			stmt.setInt(1, idSocio.intValue());
			stmt.setInt(2, idSocio.intValue());
			stmt.setLong(3, _id);
		}
		rs = stmt.executeQuery();
		if (rs.next()) 
			_pedido.loadPedidoExtendedFromResultSet(rs);
		else 
			_pedido = null;

		if (rs != null) rs.close();
		if (stmt != null) stmt.close(); 

		return _pedido;
	}

	public static ArrayList<PedidoExtended> searchPedidosExtended(Connection conn, long idSocio, String where, String sort) throws SQLException {
		String query = null;
		if (0 == idSocio) query = GET_SQL_GRUPO;
		else query = GET_SQL_SOCIO;
		
		if ((where != null) && (where.trim().length()>0)) {
			query +="AND " + where + " ";
		}
		if ((sort != null) && (sort.trim().length()>0)) {
			query +="ORDER BY " + sort + " ";
		}
		// Creamos el Statement y el ResultSet.
		PreparedStatement stm = conn.prepareStatement(query);
		if (0 != idSocio) {
			stm.setLong(1, idSocio);
			stm.setLong(2, idSocio);
		}
		ResultSet rs = stm.executeQuery();

		// Procesamos el ResultSet.
		ArrayList<PedidoExtended> lPedido = null;
		while (rs.next()) {
			PedidoExtended _pedido = new PedidoExtended();
			_pedido.loadPedidoExtendedFromResultSet(rs);
			if (null == lPedido) 
				lPedido = new ArrayList<PedidoExtended>();
			lPedido.add(_pedido);
		}
		rs.close();
		stm.close();
		return lPedido;
	}

	public void loadPedidoExtendedFromResultSet(ResultSet rs) throws SQLException {
		this.loadPedidoFromResultSet(rs);
		
		if (null != rs.getString(7))
			this.nMonedas = rs.getInt(7);
		else
			this.nMonedas = 0;
		if (null != rs.getString(8))
			this.nApuntes = rs.getInt(8);
		else
			this.nApuntes = 0;
		this.nombreEstado = rs.getString(9);
	}

	public int getNMonedas() {
		return nMonedas;
	}

	public int getNApuntes() {
		return nApuntes;
	}
	
	public String getNombreEstado() {
		return this.nombreEstado;
	}
}
